<?php

/**
 * Created by JetBrains PhpStorm.
 * User: xaviet
 * Date: 10/3/13
 * Time: 2:44 PM
 * To change this template use File | Settings | File Templates.
 */
class HSCommon {
    public static function removeMultipleBlank($str) {
        return trim(htmlspecialchars_decode(trim(preg_replace('!\s+!', ' ', $str))));
    }

    public static function checkFolderExisted($year, $month, $day, $folder_name = 'company') {
        $base = dirname(Yii::getPathOfAlias('application')) . "/pictures/$folder_name";
        $url = $base . "/" . $year;
        if (!is_dir($base)) {
            mkdir($base, 0777);
        }
        if (!is_dir($url)) {
            mkdir($url, 0777);
        }

        if (!is_dir($url . '/' . $month)) {
            mkdir($url . '/' . $month, 0777);
        }
        if (!is_dir($url . '/' . $month . '/' . $day)) {
            mkdir($url . '/' . $month . '/' . $day, 0777);
        }
        return $base;
    }

    public static function getExtension($fileName) {
        $explode = explode('.', $fileName);
        return strtolower(end($explode));

    }

    public static function  create_thumbnail($img_path, $thumb_path, $thumb_w = null, $thumb_h = null) {
        $ext = HSCommon::getExtension($img_path);
        if (!@getimagesize($img_path)) {
            return "error";
        }

        $file_dimensions = getimagesize($img_path);

        $file_type = strtolower($file_dimensions['mime']);
        // Tạo ảnh mới sử dụng hàm trong thư viện gd
        if ($file_type == 'image/jpeg' || $file_type == 'image/jpg' || $file_type == 'image/pjpeg') {
            $src_img = imagecreatefromjpeg($img_path);
        } elseif ($file_type == 'image/png') {
            $src_img = imagecreatefrompng($img_path);
        } elseif ($file_type == 'image/gif') {
            $src_img = imagecreatefromgif($img_path);
        } else {
            return "error";
        }
        // Lấy kích thước của ảnh
        $old_x = imageSX($src_img);
        $old_y = imageSY($src_img);

        // Tính kích thước mới cho ảnh thumbnail
        // Nếu không điền kích thước thumbnail thì giữ nguyên kích thước ban đầu của ảnh
        if (!$thumb_w || !$thumb_h) {
            $thumb_w = $old_x;
            $thumb_h = $old_y;
        } // 	1. Tính tỷ lệ kích thước của ảnh ban đầu so với kích thước thumbnail cần tạo.
        //	2. Nếu tỷ lệ của width lớn hơn tỷ lệ của height, ta sẽ thu nhỏ ảnh theo tỷ lệ của width và ngược lại.
        else {
            $ratio1 = $old_x / $thumb_w;
            $ratio2 = $old_y / $thumb_h;
            if ($ratio1 > $ratio2) {
                $thumb_w = $thumb_w;
                $thumb_h = $old_y / $ratio1;
            } else {
                $thumb_h = $thumb_h;
                $thumb_w = $old_x / $ratio2;
            }
        }

        // Tạo ảnh trắng mới với tỷ lệ mới
        $dst_img = ImageCreateTrueColor($thumb_w, $thumb_h);

        // Copy ảnh cũ vào ảnh mới theo đúng tỷ lệ
        imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);

        // Kết quả cuối cùng, xuất ảnh với tên ban đầu
        if ($file_type == 'image/png')
            imagepng($dst_img, $thumb_path);
        else
            imagejpeg($dst_img, $thumb_path);

        // Hủy bộ nhớ cho cả ảnh nguồn và đích
        imagedestroy($dst_img);
        imagedestroy($src_img);

        return 'success';
    }

    public static function getSEO($str) {
        $signed = array("à", "á", "ạ", "ả", "ã", "â", "ầ", "ấ", "ậ", "ẩ", "ẫ", "ă", "ằ", "ắ"
        , "ặ", "ẳ", "ẵ", "è", "é", "ẹ", "ẻ", "ẽ", "ê", "ề", "ế", "ệ", "ể", "ễ", "ì", "í", "ị", "ỉ", "ĩ",
            "ò", "ó", "ọ", "ỏ", "õ", "ô", "ồ", "ố", "ộ", "ổ", "ỗ", "ơ"
        , "ờ", "ớ", "ợ", "ở", "ỡ",
            "ù", "ú", "ụ", "ủ", "ũ", "ư", "ừ", "ứ", "ự", "ử", "ữ",
            "ỳ", "ý", "ỵ", "ỷ", "ỹ",
            "đ",
            "À", "Á", "Ạ", "Ả", "Ã", "Â", "Ầ", "Ấ", "Ậ", "Ẩ", "Ẫ", "Ă"
        , "Ằ", "Ắ", "Ặ", "Ẳ", "Ẵ",
            "È", "É", "Ẹ", "Ẻ", "Ẽ", "Ê", "Ề", "Ế", "Ệ", "Ể", "Ễ",
            "Ì", "Í", "Ị", "Ỉ", "Ĩ",
            "Ò", "Ó", "Ọ", "Ỏ", "Õ", "Ô", "Ồ", "Ố", "Ộ", "Ổ", "Ỗ", "Ơ"
        , "Ờ", "Ớ", "Ợ", "Ở", "Ỡ",
            "Ù", "Ú", "Ụ", "Ủ", "Ũ", "Ư", "Ừ", "Ứ", "Ự", "Ử", "Ữ",
            "Ỳ", "Ý", "Ỵ", "Ỷ", "Ỹ",
            "Đ", "ê", "ù", "à",
            " ", "`", "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "=", "+", "\\", "|",
            "[", "{", "]", "}",
            ";", ":", "'", "\"",
            ",", "<", ".", ">", "/", "?",
            "“", "”");

        $unsigned = array("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a"
        , "a", "a", "a", "a", "a", "a",
            "e", "e", "e", "e", "e", "e", "e", "e", "e", "e", "e",
            "i", "i", "i", "i", "i",
            "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o"
        , "o", "o", "o", "o", "o",
            "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u",
            "y", "y", "y", "y", "y",
            "d",
            "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"
        , "A", "A", "A", "A", "A",
            "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E",
            "I", "I", "I", "I", "I",
            "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O", "O"
        , "O", "O", "O", "O", "O",
            "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U",
            "Y", "Y", "Y", "Y", "Y",
            "D", "e", "u", "a",
            "-", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "",
            "", "", "", "",
            "", "", "", "", "-", "",
            "", "");
        return strtolower(str_replace('---', '-', str_replace($signed, $unsigned, $str)));
    }

    public static function curl($url, $vars = NULL, $method = 'GET', $fl = 0, $head = 0, $nobody = 0) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($method == 'POST') {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
        }
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_HEADER, $head);
        curl_setopt($ch, CURLOPT_NOBODY, $nobody);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_COOKIEFILE, true);
        curl_setopt($ch, CURLOPT_COOKIEJAR, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 400);
        ob_start();
        $result = curl_exec($ch);
        curl_close($ch);
        ob_end_clean();
        return $result;
    }

    public static function handleArray($arr) {
        $results = array();
        foreach ($arr as $i) {
            if (trim($i) == '') continue;
            $results[] = trim($i);
        }
        return $results;
    }

    public static function handleSaveEbay($url) {
        $dom = new simple_html_dom();
        $dom->load(HSCommon::curl($url));
        $results = array();
        $wrappers = $dom->find('div[class="dd-card-s"],div[class="dd-card-m"],div[class="dd-card-l"]');
        foreach ($wrappers as $item) {
            //handle name
            $name_wrapper = $item->find('div[class="dd-item-info"]', 0);
            if ($name_wrapper == null) continue;
            $name = $name_wrapper->find('a', 0);
            if ($name == null) continue;

            //handle image
            $img_wrapper = $item->find('a[class="dd-item-img-wrapper"]', 0);
            $img = $img_wrapper->find('img', 0);

            //handle price
            $deal_price_wrapper = $item->find('div[class="dd-deal-price"]', 0);
            if ($deal_price_wrapper == null) continue;
            $deal_price_wrapper = $deal_price_wrapper->find('span', 1);
            if ($deal_price_wrapper == null) continue;

            $list_price = '';
            $list_price_wrapper = $item->find('div[class="dd-list-price"]', 0);
            if ($list_price_wrapper != null) {
                $list_price_wrapper = $list_price_wrapper->find('span', 1);
                if ($list_price_wrapper != null) {
                    $list_price = $list_price_wrapper->plaintext;
                }
            }

            $deal = new Deal();

            $deal->name = trim($name->plaintext);
            $deal->url = $name->href;
            $deal->price = trim($deal_price_wrapper->plaintext) . ($list_price != '' ? ' <span style="font-size: 12px"><del>' . trim($list_price) . '</del></span>' : "");
            $deal->picture = trim($img->src);
            $deal->created_date = date('d-m-Y');
            $deal->type = DealTypeEnum::ebay;

            $old_deal = Deal::model()->findByAttributes(array(
                'name' => $deal->name,
//                'created_date' => $deal->created_date,
                'type' => $deal->type
            ));

            if ($old_deal != null) continue;

            if ($deal->save()) {
                array_push($results, $deal);
            }

        }
        return $results;
    }

    public static function sendEbayEmail($results) {
//        switch ($type) {
//            case DealTypeEnum::fatwallet:
//                $site_name = 'FatWallet';
//                break;
//            case DealTypeEnum::ebay:
//                $site_name = 'Ebay';
//                break;
//            case DealTypeEnum::edealinfo:
//                $site_name = 'Edealinfo';
//                break;
//            case DealTypeEnum::walmart:
//                $site_name = 'Walmart';
//                break;
//            case DealTypeEnum::tiger_direct:
//                $site_name = 'TigerDirect';
//                break;
//            case DealTypeEnum::fatwallet:
//                $site_name = 'FatWallet';
//                break;
//        }

        if (count($results) > 0 && count($results) > Yii::app()->params['limit']) {
            $html = '';
            $html .= '<table style="width:100%;" border="1">';
            $html .= '<tr>';
            $html .= '<th>Picture</th>';
            $html .= '<th>Name</th>';
            $html .= '<th>Price</th>';
            $html .= '<th>Link</th>';
            $html .= '</tr>';
            foreach ($results as $result) {
                $html .= '<tr>';
                if ($result->picture != '') {
                    $html .= '<td style="text-align:center"><img style="max-width: 100px; max-height: 100px" alt="" src="' . $result->picture . '"/> </td>';
                } else {
                    $html .= '<td> </td>';
                }
                $html .= '<td> ' . $result->name . '</td>';
                $html .= '<td>' . $result->price . '</td>';
                $html .= '<td><a href="' . $result->url . '">Link</a></td>';
                $html .= '</tr>';

            }
            $html .= '</table>';

            Mailer::sendEmail(Yii::app()->params['small_email'], "Ebay's deals", $html);
        } else {
            foreach ($results as $result) {
                $html = '';
                $html .= '<p>';
                $html .= "<div>Name: " . $result->name . "</div>";
                $html .= "<div>Price: " . $result->price . "</div>";
                $html .= "<div><a href=" . $result->url . ">Link</a></div>";
                $html .= '</p>';

                $price_title = strip_tags($result->price);
                $arr = array_filter(explode('$', $price_title));
                $arr = HSCommon::handleArray($arr);
                $price_title = count($arr) >= 2 ? "$$arr[0] | $$arr[1]" : "$$arr[0]";

                Mailer::sendEmail(Yii::app()->params['small_email'], "$result->name | $price_title", $html);
            }
        }
    }

    public static function handlePrice($price) {
        $dom = new simple_html_dom();
        $dom->load($price);
        $was_price = $dom->find('span[class="was-price"]', 0);
        if ($was_price != null) {
            $was_price->style = 'text-decoration: line-through;';
            return $dom->innertext;
        } else return $price;
    }

    public static function getUserIp() {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
        {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
        {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }

    public static function  checkBanned() {
        try {

            // Some configuration (small values for demo)
            $max_sessions = 5; // 5 sessions/ip simultaneousely allowed
            $check_duration = 30; // 30 secs max lifetime of an ip on the sessions_per_ip table
            $lock_duration = 60; // time to lock your website for this ip if max_sessions is reached

            // Mysql connection
//            require_once("config.php");
            $host = 'localhost';
            $base = 'hs_map_db';
            $user = 'root';
            $password = '';
            $dbh = new PDO("mysql:host={$host};dbname={$base}", $user, $password);
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            // Delete old entries in tables
            $query = "delete from sessions_per_ip where timestampdiff(second, creation, now()) > {$check_duration}";
            $dbh->exec($query);

            $query = "delete from banned_ips where timestampdiff(second, creation, now()) > {$lock_duration}";
            $dbh->exec($query);

            // Get useful info attached to our user...
            $ip = HSCommon::getUserIp();
            $session_id = session_id();

            // Check if IP is already banned
            $banned = false;
            $count = $dbh->query("select count(*) from banned_ips where ip = '{$ip}'")->fetchColumn();
            if ($count > 0) {
                $banned = true;
            } else {
                // Count entries in our db for this ip
                $query = "select count(*)  from sessions_per_ip where ip = '{$ip}'";
                $count = $dbh->query($query)->fetchColumn();
                if ($count >= $max_sessions) {
                    // Lock website for this ip
                    $query = "insert ignore into banned_ips ( ip ) values ( '{$ip}' )";
                    $dbh->exec($query);
                    $banned = true;
                }

                // Insert a new entry on our db if user's session is not already recorded
                $query = "insert ignore into sessions_per_ip ( ip, session_id ) values ('{$ip}', '{$session_id}')";
                $dbh->exec($query);
            }

            return $banned;
        } catch (PDOException $e) {
//            var_dump($e->getMessage());
        }

    }

    public static function haversineGreatCircleDistance(
        $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000) {
        // convert from degrees to radians
        $latFrom = deg2rad($latitudeFrom);
        $lonFrom = deg2rad($longitudeFrom);
        $latTo = deg2rad($latitudeTo);
        $lonTo = deg2rad($longitudeTo);

        $latDelta = $latTo - $latFrom;
        $lonDelta = $lonTo - $lonFrom;

        $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
                cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
        return $angle * $earthRadius;
    }

    public static function vincentyGreatCircleDistance(
        $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000) {
        // convert from degrees to radians
        $latFrom = deg2rad($latitudeFrom);
        $lonFrom = deg2rad($longitudeFrom);
        $latTo = deg2rad($latitudeTo);
        $lonTo = deg2rad($longitudeTo);

        $lonDelta = $lonTo - $lonFrom;
        $a = pow(cos($latTo) * sin($lonDelta), 2) +
            pow(cos($latFrom) * sin($latTo) - sin($latFrom) * cos($latTo) * cos($lonDelta), 2);
        $b = sin($latFrom) * sin($latTo) + cos($latFrom) * cos($latTo) * cos($lonDelta);

        $angle = atan2(sqrt($a), $b);
        return $angle * $earthRadius;
    }

    public static function detectUTF8($string) {
        return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
        )+%xs', $string);
    }

    public static function calculateTime($time_to_calculate) {
        $time_now = time();
        $temp_time = $time_to_calculate;
        $distance_time = $time_now - $temp_time;
        if ($distance_time < 0) {
            return "Time to calculate must less than now";
            exit();
        }

        if ($distance_time == 1) {
            return "1 giây trước";
        } else if (ceil($distance_time / 60) == 1) {
            return "1 phút trước";
        } else if (ceil($distance_time / 60) > 1 && ceil($distance_time / 60) < 60) {
            return ceil($distance_time / 60) . " phút trước";
        } else if (ceil($distance_time / (60 * 60)) == 1) {
            return "1 tiếng trước";
        } else if (ceil($distance_time / (60 * 60)) < 24) {
            return ceil($distance_time / (60 * 60)) . " tiếng trước";
        } else if (ceil($distance_time / (60 * 60 * 24)) == 1) {
            return "1 ngày trước";
        } else if (ceil($distance_time / (60 * 60 * 24)) < 7) {
            return ceil($distance_time / (60 * 60 * 24)) . " ngày trước";
        } else if (ceil($distance_time / (60 * 60 * 24 * 7)) == 1) {
            return "1 tuần trước";
        } else if (ceil($distance_time / (60 * 60 * 24 * 7)) < 4) {
            return ceil($distance_time / (60 * 60 * 24 * 7)) . " tuần trước";
        } else if (ceil($distance_time / (60 * 60 * 24 * 7 * 4)) == 1) {
            return "1 tháng trước";
        } else if (ceil($distance_time / (60 * 60 * 24 * 7 * 4)) < 12) {
            return ceil($distance_time / (60 * 60 * 24 * 7 * 4)) . " tháng trước";
        } else if (ceil($distance_time / (60 * 60 * 24 * 7 * 4 * 12)) == 1) {
            return "1 năm trước";
        } else {
            return ceil($distance_time / (60 * 60 * 24 * 7 * 4 * 12)) . " năm trước";
        }
    }

    public static function getCurrentUrl($port = ':6111') {
        $pageURL = 'http';
        if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80") {
            $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
        } else {
            $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
        }
        return str_replace($port, '', $pageURL);
    }

    public static function getDistance($lat1, $lng1, $lat2, $lng2, $miles = true) {

        $pi80 = M_PI / 180;
        $lat1 *= $pi80;
        $lng1 *= $pi80;
        $lat2 *= $pi80;
        $lng2 *= $pi80;

        $r = 6372.797; // mean radius of Earth in km
        $dlat = $lat2 - $lat1;
        $dlng = $lng2 - $lng1;
        $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
        $km = $r * $c;

        return number_format((float)($miles ? ($km * 0.621371192) : $km), 2, '.', '');
    }
}
